﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ShuticsBiz;
using ShuticsEntities;

namespace TPDiseño2011
{
    public partial class frmCompletarCuestionario : Form
    {
        public Cuestionario cuestionario { get; set; }
        Dictionary<RadioButton, CuestionarioItem> radioButtons = new Dictionary<RadioButton, CuestionarioItem>();

        public frmCompletarCuestionario(Cuestionario cu)
        {
            InitializeComponent();
            this.cuestionario = cu;
        }

        private void frmCompletarCuestionario_Load(object sender, EventArgs e)
        {
            try
            {
                Estado estadoAnterior = cuestionario.Estado;
                this.cuestionario = ControlCuestionario.ValidarEstado(cuestionario);

                if (estadoAnterior.ID != cuestionario.Estado.ID)
                {
                    if (cuestionario.Estado.ID.Equals((int)ControlCuestionario.Estados.Incompleto))
                    {
                        MessageBox.Show(Messages.ERRORCUESTIONARIOINCOMPLETO, Messages.CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Error);
                        this.Close();
                    }
                    else if (cuestionario.Estado.ID.Equals((int)ControlCuestionario.Estados.SinContestar))
                    {
                        MessageBox.Show(Messages.ERRORCUESTIONARIOSINCONTESTAR, Messages.CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Error);
                        this.Close();
                    }
                }
                else
                {
                    if (cuestionario.Estado.ID.Equals((int)ControlCuestionario.Estados.Activo))
                    {
                        lblBienvenido.Text += cuestionario.Candidato.Apellido + " " + cuestionario.Candidato.Nombre;
                        lblBienvenido.Location = new Point(tpInstrucciones.Width / 2 - lblBienvenido.Width / 2, lblBienvenido.Location.Y);
                        rtbInstrucciones.Text = cuestionario.Evaluacion.Instrucciones;
                    }
                    else
                    {
                        wizard.SelectedIndex = wizard.SelectedIndex + 1;
                        //Actualizamos la cantidad de accesos y la fecha del ultimo ingreso
                        ControlCuestionario.ActualizarCuestionario(cuestionario);
                        //Obtenemos las preguntas para el bloque actual y las mostramos
                        List<CuestionarioPregunta> preguntas = ControlCuestionario.ObtenerBloquePreguntas(cuestionario);
                        MostrarPreguntas(preguntas);
                        //Si es el ultimo bloque, creamos el boton finalizar
                        EsUltimoBloque();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        
        private void btnAceptar_Click(object sender, EventArgs e)
        {
            try
            {
                wizard.SelectedIndex = wizard.SelectedIndex + 1;

                ControlCuestionario.IniciarCuestionario(cuestionario);
                List<CuestionarioPregunta> preguntas = ControlCuestionario.ObtenerBloquePreguntas(cuestionario);
                EsUltimoBloque();
                MostrarPreguntas(preguntas);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void MostrarPreguntas(List<CuestionarioPregunta> preguntas)
        {
            for(int i=preguntas.Count -1; i>=0; i--)
            {
                GroupBox gp = new GroupBox();
                gp.AutoSize = true;
                gp.Text = "Pregunta Nro. " + (preguntas[i].Orden + 1);
                gp.Dock = DockStyle.Top;

                Label a = new Label();
                a.Text = preguntas[i].Pregunta;
                a.Font = new Font(this.Font, FontStyle.Bold);
                a.Height = TextRenderer.MeasureText(a.Text, a.Font, pnlBloque.Size, TextFormatFlags.WordBreak).Height + 15;
                a.Dock = DockStyle.Top;
                a.TextAlign = ContentAlignment.MiddleLeft;

                List<CuestionarioItem> items = preguntas[i].Items.ToList().OrderBy(c=> c.Orden).ToList();

                for (int j = items.Count - 1; j >= 0; j--)
                {
                    RadioButton rb1 = new RadioButton();
                    rb1.Left = 20;
                    rb1.MaximumSize = pnlBloque.Size;
                    rb1.Text = items[j].Descripcion;
                    rb1.Height = TextRenderer.MeasureText(rb1.Text, rb1.Font, pnlBloque.Size, TextFormatFlags.WordBreak).Height + 10;
                    rb1.Dock = DockStyle.Top;
                    rb1.Margin = new Padding(20);
                    radioButtons.Add(rb1, items[j]);
                    gp.Controls.Add(rb1);
                }
                gp.Controls.Add(a);
                pnlBloque.Controls.Add(gp);
            }
        }

        private void btnSiguiente_Click(object sender, EventArgs e)
        {
            bool completo = true;
            foreach (Control ctrl in pnlBloque.Controls)
            {
                //Recorremos la lista de controles del panel, si es un groupbox, buscamos el radiobutton seleccionado
                if (ctrl is GroupBox)
                {
                    try
                    {
                        //Si hay un radiobutton seleccionado para este groupbox, marcamos el cuestionarioitem como seleccionado
                        RadioButton seleccionado = ctrl.Controls.OfType<RadioButton>().Single(r => r.Checked);
                        CuestionarioItem item = radioButtons[seleccionado];
                        item.Seleccionado = true;
                    }
                    catch (Exception)
                    {
                        //Si no hay ningun radiobutton seleccionado para el groupbox, mostramos el error en pantalla y deseleccionamos los items previos del diccionario (para evitar que al seleccionar nuevos items despues del error permanezcan los anteriores seleccionados)
                        foreach (CuestionarioItem item in radioButtons.Values)
                        {
                            item.Seleccionado = false;
                        }
                        completo = false;
                        lblResponderTodas.Visible = true;
                        break;
                    }
                }
            }

            //Si se respondieron todas las preguntas, avanzamos el bloque activo.
            if (completo)
            {
                radioButtons = new Dictionary<RadioButton, CuestionarioItem>();
                pnlBloque.Controls.Clear();
                lblResponderTodas.Visible = false;
                ControlCuestionario.AvanzarCuestionario(cuestionario);

                EsUltimoBloque();
                List<CuestionarioPregunta> preguntas = ControlCuestionario.ObtenerBloquePreguntas(cuestionario);
                MostrarPreguntas(preguntas);
            }
        }

        private void EsUltimoBloque()
        {
            if (cuestionario.BloqueActivo * cuestionario.Evaluacion.PreguntasPorBloque >= cuestionario.Preguntas.Count)
            {
                Button btnFinalizar = new Button();
                btnFinalizar.Text = "Finalizar";
                btnFinalizar.Click += new System.EventHandler(btnFinalizar_Click);
                btnFinalizar.Location = btnSiguiente.Location;
                btnFinalizar.Size = btnSiguiente.Size;
                btnSiguiente.Visible = false;
                tpBloque1.Controls.Add(btnFinalizar);
            }
        }

        private void btnFinalizar_Click(object sender, EventArgs e)
        {
            bool completo = true;
            foreach (Control ctrl in pnlBloque.Controls)
            {
                //Recorremos la lista de controles del panel, si es un groupbox, buscamos el radiobutton seleccionado
                if (ctrl is GroupBox)
                {
                    try
                    {
                        //Si hay un radiobutton seleccionado para este groupbox, marcamos el cuestionarioitem como seleccionado
                        RadioButton seleccionado = ctrl.Controls.OfType<RadioButton>().Single(r => r.Checked);
                        CuestionarioItem item = radioButtons[seleccionado];
                        item.Seleccionado = true;
                    }
                    catch (Exception)
                    {
                        //Si no hay ningun radiobutton seleccionado para el groupbox, mostramos el error en pantalla y deseleccionamos los items previos del diccionario (para evitar que al seleccionar nuevos items despues del error permanezcan los anteriores seleccionados)
                        foreach (CuestionarioItem item in radioButtons.Values)
                        {
                            item.Seleccionado = false;
                        }
                        completo = false;
                        lblResponderTodas.Visible = true;
                        break;
                    }
                }
            }

            //Si se respondieron todas las preguntas, avanzamos el bloque activo.
            if (completo)
            {
                if (ControlCuestionario.FinalizarCuestionario(cuestionario))
                {
                    MessageBox.Show(Messages.FINALIZARCUESTIONARIOEXITO, Messages.CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBox.Show(Messages.ERRORFINALIZARCUESTIONARIO, Messages.CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                this.Close();
            }
        }
    }
}
